package com.xinzhidi.web.dtuusr.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinzhidi.common.core.domain.model.LoginUser;
import com.xinzhidi.common.core.page.TableDataInfo;
import com.xinzhidi.common.utils.DateUtils;
import com.xinzhidi.common.utils.SecurityUtils;
import com.xinzhidi.common.utils.StringUtils;
import com.xinzhidi.common.utils.bean.BeanUtils;
import com.xinzhidi.web.dtuusr.domain.DtuUsr;
import com.xinzhidi.web.dtuusr.dto.DtuUsrAddDto;
import com.xinzhidi.web.dtuusr.dto.DtuUsrListDto;
import com.xinzhidi.web.dtuusr.dto.DtuUsrUpdDto;
import com.xinzhidi.web.dtuusr.mapper.DtuUsrMapper;
import com.xinzhidi.web.dtuusr.po.DtuUsrPo;
import com.xinzhidi.web.dtuusr.vo.DtuUsrInfoVo;
import com.xinzhidi.web.dtuusr.vo.DtuUsrListVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;


/**
 * dtu设备Service业务层处理
 *
 * @author cx
 * @date 2023-06-15
 */
@Service
public class DtuUsrService extends ServiceImpl<DtuUsrMapper, DtuUsr> {
    @Autowired
    private DtuUsrMapper dtuUsrMapper;

    /**
     * 查询dtu设备
     *
     * @param id dtu设备主键
     * @return dtu设备
     */
    public DtuUsrInfoVo selectDtuUsrById(Long id) {
        DtuUsr dtuUsr = dtuUsrMapper.selectById(id);
        DtuUsrInfoVo infoVo = new DtuUsrInfoVo();
        BeanUtils.copyProperties(dtuUsr, infoVo);
        return infoVo;
    }

    /**
     * 查询dtu设备
     *
     * @param po dtu设备查询参数
     * @return dtu设备
     */
    public DtuUsr selectByParam(DtuUsrPo po) {
        DtuUsr dtuUsr = this.getOne(this.buildGenTableQueryWrapper(po));
        return dtuUsr;
    }


    /**
     * 查询dtu设备列表
     *
     * @param dto 查询dtu设备dto
     * @return dtu设备
     */
    public TableDataInfo<DtuUsrListVo> selectDtuUsrList(DtuUsrListDto dto) {
        LambdaQueryWrapper<DtuUsr> wrapper = Wrappers.lambdaQuery();
        wrapper.like(StringUtils.isNotEmpty(dto.getName()), DtuUsr::getName, dto.getName());
        wrapper.like(StringUtils.isNotBlank(dto.getUuid()), DtuUsr::getUuid, dto.getUuid());
        wrapper.like(StringUtils.isNotBlank(dto.getRegisterPackage()), DtuUsr::getRegisterPackage, dto.getRegisterPackage());
        wrapper.orderByDesc(DtuUsr::getId);
        return TableDataInfo.getDataTable(dtuUsrMapper.selectList(wrapper), (domain -> {
            DtuUsrListVo vo = new DtuUsrListVo();
            BeanUtils.copyProperties(domain, vo);
            return vo;
        }));
    }

    /**
     * 新增dtu设备
     *
     * @param dto 新增dtu设备dto
     * @return 结果
     */
    public int insertDtuUsr(DtuUsrAddDto dto) {
        this.checkExist(null, dto.getName(), dto.getUuid(), dto.getRegisterPackage());
        LoginUser loginUser = SecurityUtils.getLoginUser();
        DtuUsr dtuUsr = new DtuUsr();
        BeanUtils.copyProperties(dto, dtuUsr);
        dtuUsr.setCreateBy(loginUser.getUserId().toString());
        dtuUsr.setCreateTime(DateUtils.getNowDate());
        return dtuUsrMapper.insert(dtuUsr);
    }

    /**
     * 修改dtu设备
     *
     * @param dto 修改dtu设备dto
     * @return 结果
     */
    public int updateDtuUsr(DtuUsrUpdDto dto) {
        this.checkExist(dto.getId(), dto.getName(), dto.getUuid(), dto.getRegisterPackage());
        LoginUser loginUser = SecurityUtils.getLoginUser();
        DtuUsr dtuUsr = new DtuUsr();
        BeanUtils.copyProperties(dto, dtuUsr);
        dtuUsr.setUpdateBy(loginUser.getUserId().toString());
        dtuUsr.setUpdateTime(DateUtils.getNowDate());
        return dtuUsrMapper.updateById(dtuUsr);
    }

    /**
     * 判断新增或修改的dtu字段是否已经存在
     *
     * @param id              dtu设备主键
     * @param name            dtu设备名称
     * @param uuid            dtu设备心跳包
     * @param registerPackage dtu设备注册包
     * @return 结果
     */
    public void checkExist(Long id, String name, String uuid, String registerPackage) {
        LambdaQueryWrapper<DtuUsr> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(StringUtils.isNotEmpty(name), DtuUsr::getName, name);
        wrapper.ne(id != null, DtuUsr::getId, id);
        DtuUsr dtuUsr = dtuUsrMapper.selectOne(wrapper);
        if (dtuUsr != null) {
            throw new RuntimeException("设备名称已经存在");
        }

        wrapper.clear();
        //查判断心跳包或注册包是否已存在
        wrapper.and((w) -> {
            w.eq(DtuUsr::getUuid, uuid)
                    .or().eq(DtuUsr::getRegisterPackage, registerPackage);
        }).ne(id != null, DtuUsr::getId, id);
        List<DtuUsr> list = dtuUsrMapper.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(list)) {
            throw new RuntimeException("心跳包或注册包已经存在");
        }
        if (!uuid.startsWith("Connect-")) {
            throw new RuntimeException("心跳包必须以'Connect-'开头");
        }
        if (!registerPackage.startsWith("ceebic-")) {
            throw new RuntimeException("注册包必须以'ceebic-'开头");
        }
    }

    /**
     * 修改dtu设备（协议使用）
     *
     * @param dtuUsr dtu
     * @return 结果
     */
    public int updateDtuUsr(DtuUsr dtuUsr) {
        dtuUsr.setUpdateTime(DateUtils.getNowDate());
        return dtuUsrMapper.updateById(dtuUsr);
    }

    /**
     * 批量删除dtu设备
     *
     * @param ids 需要删除的dtu设备主键
     * @return 结果
     */
    public int deleteDtuUsrByIds(Long[] ids) {
        return dtuUsrMapper.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 删除dtu设备信息
     *
     * @param id dtu设备主键
     * @return 结果
     */
    public int deleteDtuUsrById(Long id) {
        return dtuUsrMapper.deleteById(id);
    }

    /**
     * 组装查询条件
     *
     * @param usrPo 查询条件po
     * @return 协议指令
     */
    private LambdaQueryWrapper<DtuUsr> buildGenTableQueryWrapper(DtuUsrPo usrPo) {
        LambdaQueryWrapper<DtuUsr> wrapper = new LambdaQueryWrapper<>();        wrapper.eq(usrPo.getId() != null, DtuUsr::getId, usrPo.getId())
                .like(org.apache.commons.lang3.StringUtils.isNotBlank(usrPo.getName()), DtuUsr::getName, usrPo.getName())
                .eq(org.apache.commons.lang3.StringUtils.isNotBlank(usrPo.getUuid()), DtuUsr::getUuid, usrPo.getUuid());
        return wrapper;
    }

    /**
     * 获取dtu在线设备列表
     *
     * @return dtu设备列表
     */
    public List<DtuUsr> getOnOffList() {
        return dtuUsrMapper.getOnOffList();
    }

    public TableDataInfo<DtuUsrListVo> getDtuUsrByName(String dtuName) {
        LambdaQueryWrapper<DtuUsr> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(DtuUsr::getName, dtuName);
        return TableDataInfo.getDataTable(list(wrapper), (domain -> {
            DtuUsrListVo vo = new DtuUsrListVo();
            BeanUtils.copyProperties(domain, vo);
            return vo;
        }));
    }
}
